home *** CD-ROM | disk | FTP | other *** search
/ Interplay's Learn to Program Basic (Review Copy) / Learn to Program Basic Review Copy (Interplay)(June 23, 1998).ISO / pc / ltpbasic / projects / row4.bas < prev    next >
BASIC Source File  |  1998-02-21  |  8KB  |  342 lines

  1. REM Row 4 Program
  2.  
  3. REM The REM statements at the
  4. REM bottom of the program contain
  5. REM ideas for changes you can
  6. REM program, to make it your own
  7. REM way.
  8.  
  9. REM This program uses lots of
  10. REM Gosub commands, over and over
  11. REM in one small-looking loop.
  12. CLS
  13. Gosub Startup
  14. Gosub Init
  15. Gosub DrawGrid
  16. REM Here's the main loop that gets
  17. REM executed over and over:
  18. while TRUE
  19. Gosub AnnounceTurn
  20. Gosub PlayerMove
  21. Gosub TestWinner
  22. if test then
  23. Gosub AnnounceWinner
  24. end
  25. endif
  26. Gosub TestCat
  27. if test Then
  28. Banner "Tie Game! The Cat Wins!"
  29. End
  30. Endif
  31.  
  32. currentPlayer = currentPlayer + 1
  33. if currentPlayer > numPlayers Then currentPlayer = 1
  34. wend
  35.  
  36. REM program end
  37. End
  38. REM That's it!  The above 15 lines
  39. REM of code, or so, is the whole
  40. REM program.  The catch, of course,
  41. REM is all the GoSub commands, which
  42. REM execute subroutines listed
  43. REM below.
  44.  
  45. REM -- program subroutines --
  46.  
  47. REM Initialize for new game
  48. Init:
  49. REM General Variables
  50. REM "gridNum" defined by startup
  51. winNum = 4
  52. Dim squaresHeld(gridNum*gridNum)
  53.  
  54. REM Player Variables
  55. Rem "numPlayers" defined by startup
  56. currentPlayer = 1
  57. Dim playerSquare(numPlayers)
  58. Dim playerColor(numPlayers)
  59. Dim stateColors(numPlayers+1)
  60. for i = 1 to numPlayers
  61. Read playerColor(i)
  62. stateColors(i+1) = playerColor(i)
  63. next
  64.  
  65. REM Grid Variables
  66. Rem -- defined by startup
  67. Rem gridStartX = 20
  68. Rem gridStartY = 4
  69. Rem gridWidth = 38
  70. Rem gridHeight = 38    
  71. Rem -------
  72. gridColor = 21 ' Black
  73. gridBack = 10 ' Grey
  74. stateColors(1) = gridBack
  75.  
  76. REM Square variables
  77. square = 0
  78. squareColor = gridBack
  79.  
  80. Color 6 ' white
  81. FillRect 0,0 To 320,240
  82. for i = 1 To (gridNum * gridNum)
  83. REM Clear all the square values
  84. squaresHeld(i) = 0
  85. next
  86. return
  87.  
  88. DrawGrid:
  89. REM Draw a gridNum x gridNum (4x4) grid
  90. Color gridBack
  91. FillRect gridStartX, gridStartY To gridStartX + gridWidth * gridNum, gridStartY + gridHeight * gridNum
  92. Color gridColor
  93. Rect gridStartX, gridStartY To gridStartX + gridWidth * gridNum, gridStartY + gridHeight * gridNum
  94. For i = 1 to gridNum-1
  95. line gridStartX+i*gridWidth,gridStartY To gridStartX + i * gridWidth, gridStartY + gridHeight * gridNum
  96. line gridStartX,gridStartY+i*gridHeight To gridStartX + gridWidth * gridNum, gridStartY + i * gridHeight 
  97. Next i
  98. return
  99.  
  100.  
  101. Rem Move the player with the mouse
  102. PlayerMove:
  103. sq = playerSquare(currentPlayer)
  104. square = sq
  105. placed = FALSE
  106. while placed = FALSE
  107. x = MouseX - gridStartX
  108. y = MouseY - gridStartY
  109. if x < 0 then x = 0
  110. if y < 0 then y = 0
  111. c = Int(x/gridWidth)
  112. r = Int(y/gridHeight)
  113. if c >= gridNum then c = gridNum-1
  114. if r >= gridNum then r = gridNum-1
  115. sq = r * gridNum + c
  116. if sq <> square Then
  117. squareColor = stateColors(squaresHeld(square+1)+1)
  118. Gosub DrawSquare
  119. squareColor = playerColor(currentPlayer)
  120. square = sq
  121. Gosub DrawSquare
  122. endif
  123.  
  124. if ClickRect(0,0 to 320,240) then 
  125. if squaresHeld(square+1) = 0 then
  126. placed = TRUE
  127. playerSquare(currentPlayer) = square
  128. squaresHeld(square+1) = currentPlayer
  129. else
  130. REM Here you could beep
  131. REM if the user clicks on a
  132. REM square that's already full.
  133. endif
  134. else
  135. REM Right here you could insert
  136. REM code to loop animation, or
  137. REM anything you want to happen
  138. REM when the user isn't doing
  139. REM anything.
  140. Endif
  141.  
  142. Wend
  143. return
  144.  
  145. REM Draw a square (square) in a color (squareColor)
  146. DrawSquare:
  147. r = Int(square / gridNum)
  148. c = square Mod gridNum
  149. x1 = gridStartX + c * gridWidth + 1
  150. y1 = gridStartY + r * gridHeight + 1
  151. x2 = x1 + gridWidth - 2
  152. y2 = y1 + gridHeight - 2
  153. Color squareColor
  154. REM FillRect x1,y1 to x2,y2
  155. FillCircle x1+gridWidth/2-2,y1+gridHeight/2-2,gridWidth/2-4
  156. return
  157.  
  158.  
  159. REM Test for a winner
  160. REM Returns Test (TRUE for a winner) and Plyr (Player who won)
  161. TestWinner:
  162. test = FALSE
  163. for plyr = 1 to numPlayers
  164. for sq = 0 to (gridNum*gridNum)-1
  165. if squaresHeld(sq+1) = plyr then
  166. r = int(sq/gridNum)
  167. c = sq Mod gridNum
  168. REM look for horizontal run
  169. if gridNum-c >= winNum Then
  170. test = TRUE
  171. for i=sq to sq+winNum-1
  172. if squaresHeld(i+1) <> plyr Then test = FALSE
  173. next
  174. if test = TRUE Then return
  175. endif
  176. REM look for vertical run
  177. if gridNum-r >= winNum Then
  178. test = TRUE 
  179. for i = 0 to 3
  180. if squaresHeld(1+sq + i*gridNum) <> plyr Then test = FALSE
  181. next
  182. if test = TRUE Then return
  183. EndIf
  184. REM look for diagonal down
  185. if gridNum-r >= winNum AND gridNum-c >= winNum Then
  186. test = TRUE
  187. for i = 0 to 3
  188. if squaresHeld(1+sq + i*gridNum + i) <> plyr then test = FALSE
  189. next
  190. if test = TRUE then return
  191. endif
  192. REM look for diagonal up
  193. if r >= winNum-1 AND gridNum-c >= winNum Then
  194. test = TRUE
  195. for i = 0 to 3
  196. if squaresHeld(1+sq - i*gridNum +i) <> plyr then test = FALSE
  197. next
  198. if test = TRUE then return
  199. endif
  200. EndIf
  201. Next sq
  202. Next plyr
  203. Return
  204.  
  205. REM Test for a "Cat" game
  206. REM returns Test (T/F)
  207. TestCat:
  208. Test = TRUE
  209. for i = 0 to (gridNum*gridNum)-1
  210. if squaresHeld(i+1) = 0 Then
  211. Test = FALSE
  212. return
  213. endif
  214. next
  215. return
  216.  
  217. REM Title and setup
  218. Startup:
  219. CLS
  220. Color 6
  221. TextColor 21
  222. FillRect 0,0 to 320,240
  223. Print " RRRR     OOOOO   W       W"
  224. Print " R   R   O     O  W       W"
  225. Print " RRRR    O     O  W   W   W"
  226. Print " R   R   O     O   W  W  W"
  227. Print " R    R   OOOOO     W  W"
  228. Print
  229. Print "         4    4 "
  230. Print "         4    4 "
  231. Print "         4    4 "
  232. Print "          44444444"
  233. Print "              4 "
  234. Print "              4 "
  235. Print
  236. Print "(Press any key to play)"
  237. while inkey$ = ""
  238. wend
  239. CLS
  240. Color 6
  241. FillRect 0,0 to 320,240
  242. Print "This is a game for two to four"
  243. Print "players.  The object is to place"
  244. Print "four of your markers in a row."
  245. Print "The markers can align horizontally"
  246. Print "or vertically or along a diagonal."
  247. Print 
  248.  
  249. gridNum = 0
  250. numPlayers = 0
  251.  
  252. Rem set this to 0 to allow user to choose
  253. winNum = 4
  254.  
  255. while gridNum < 4 OR gridNum > 20
  256. Position 0,6
  257. Print "                                        "
  258. Position 0,6
  259. Input "How large a grid? (4-10) ",gridNum
  260. wend
  261. while numPlayers < 2 OR numPlayers > 4
  262. Position 0,7
  263. Print "                                        "
  264. Position 0,7
  265. Input "How many players? (2-4) ",numPlayers
  266. wend
  267. while winNum < 3 OR winNum > gridNum
  268. Position 0,8
  269. Print "                                        "
  270. Position 0,8
  271. Print "How many in a row to win? (3-"gridNum") ";
  272. Input winNum
  273. wend
  274.  
  275. gridHeight = 230 / gridNum
  276. gridWidth = gridHeight
  277. gridStartX = 316 - (gridWidth * gridNum)
  278. gridStartY = 119 - (gridHeight * gridNum) / 2
  279.  
  280. CLS
  281. FillRect 0,0 to 320,240
  282. Print "Okay! Let's go!"
  283. Print "First, though, let's get each"
  284. Print "player's name."
  285. Dim playerName$(numPlayers)
  286. for i = 1 to numPlayers
  287. Print "Player "+str$(i)", what is your name?"
  288. Input temp$
  289. if temp$ = "" then temp$ = "Player "+str$(i)
  290. playerName$(i) = temp$
  291. next
  292. CLS
  293. Return
  294.  
  295. Rem Announce whose turn it is
  296. AnnounceTurn:
  297. Position 0,0
  298. print "Current"
  299. print "Player:"
  300. print Left$(playername$(currentPlayer),10);"          "
  301. return
  302.  
  303. REM Announce winner (plyr)
  304. AnnounceWinner:
  305. Banner playerName$(plyr)+" Wins!"
  306. return
  307.  
  308. REM Player Colors
  309. Data 152 ' Green
  310. Data 200 ' Purple
  311. Data 21     ' Black
  312. Data 94  ' Red
  313.  
  314.  
  315. REM Ideas for ways to make the game
  316. REM better:
  317.  
  318. REM - Jazz up the "Current Player"
  319. REM   display.
  320. REM - Use a paint program to draw a
  321. REM   new "Row 4" title screen, and
  322. REM   display it at the beginning
  323. REM   in place of the cheesy text
  324. REM   screen that's in this code now.
  325. REM - Play a sound when you place
  326. REM   a piece.
  327. REM - Play a buzz sound when you
  328. REM   try to place a piece on a 
  329. REM   square that's already full.
  330. REM - Let the user choose how many
  331. REM   squares in a row are needed
  332. REM   to win.  (This one's easy if
  333. REM   you look at the code.)
  334. REM - Use a paint program to draw
  335. REM   customized game pieces for
  336. REM   the 6x6 grid, and if the user
  337. REM   chooses to play the 6x6 grid,
  338. REM   draw your custom pieces
  339. REM   instead of just drawing circles
  340. REM   with the FillCircle() function.
  341.